﻿using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Business.AID;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using Data.AID;
using Business.AID.Extensions;
using System.Web;
using System.Data;
using System.Text;
using System.IO;

namespace Presentation.AID.WebPart.VWPMinhasMetas
{
    public partial class VWPMinhasMetasUserControl : UserControl
    {

        #region Propriedades
        
        private int IdEmployee
        {
            get { return (int)ViewState["IdColaborador"]; }
            set { ViewState["IdColaborador"] = value; }
        }
        private bool isAllowedUser
        {
            get { return SPContext.Current.Web.Groups["Exceções"].ContainsCurrentUser; }
        }
        private bool isValidPeriod
        {
            get
            {
                PeriodoAtividadeBO periodoAtividadeBO = new PeriodoAtividadeBO();
                return periodoAtividadeBO.isValidPeriod("Cadastrar");
            }
        }
        private int IdForm
        {
            get { return (int)ViewState["ViewStateIdFormulario"]; }
            set { ViewState["ViewStateIdFormulario"] = value; }
        }
        private int IdGoal
        {
            get { return (int)ViewState["IdMeta"]; }
            set { ViewState["IdMeta"] = value; }
        }
        private int IdQueryString
        {
            get
            {
                object obj = Request.QueryString["f"];
                return (obj == null) ? 0 : Convert.ToInt32(obj);
            }
        }

        #endregion

        private List<Meta> ListaMeta;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                try
                {
                    if (IdQueryString != 0)
                    {
                        IdForm = IdQueryString;
                        LoadForm(IdForm);
                    }
                    else
                    {
                        Response.Write("<script> alert('Formulário não encontrado.'); </script>");
                        Response.Redirect("default.aspx");
                    }
                }
                catch (Exception exPageLoad)
                {
                    Response.Write(@"<script>");
                    Response.Write(@"alert('ERROR: Error ao carregar a página. " + exPageLoad.Message + "');");
                    Response.Write(@"</script>");
                    Response.Redirect("default.aspx");
                }
            }
        }

        #region Métodos Privados

        private void LoadForm(int idForm)
        {
            try
            {
                Colaborador colaborador = new ColaboradorBO().GetEmployeeByLogin(SPContext.Current.Web.CurrentUser.LoginName);
                Formulario formulario = new FormularioBO().GetFormById(IdForm);

                if (formulario != null && colaborador != null)
                {
                    if (formulario.Nome == colaborador.Nome)
                    {
                        IdEmployee = formulario.IdColaborador;

                        /*Carregar os controles.*/
                        LoadFormControls(formulario);

                        /*Carregar as metas.*/
                        LoadGoals(idForm);

                        /*Desativar os controles.*/
                        DisableControls(formulario);
                    }
                    else
                    {
                        string mensagem = "Essa meta somente pode ser preenchida por: " + formulario.Nome;
                        Response.Write("<script> alert('" + mensagem + "'); location.href='/SitePages/MinhasMetas.aspx'; </script>");
                    }
                }
            }
            catch (Exception ex)
            {
                Response.Write(@"<script>");
                Response.Write(@"alert('ERROR: Error ao carregar o formulário. " + ex.Message + "');");
                Response.Write(@"window.location='http://intranew.abdi.com.br/';");
                Response.Write(@"</script>");
            }
        }
        private void LoadFormControls(Formulario formulario)
        {
            string _area = formulario.Area == "" ? string.Empty : formulario.Area.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries)[1];
            string _dataAdmissao = formulario.DtAdmissao == null ? string.Empty : formulario.DtAdmissao.ToShortDateString();
            string _funcao = formulario.Funcao == "" ? string.Empty : formulario.Funcao.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries)[1];
            string _gestorImediato = formulario.GestorImediato == null ? string.Empty : formulario.GestorImediato.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries)[1];
            string _matricula = formulario.Matricula == "" ? string.Empty : formulario.Matricula;
            string _nome = formulario.Nome == "" ? string.Empty : formulario.Nome;
            

            txtArea.Text = _area;
            txtDtAdmissao.Text = _dataAdmissao;
            txtFuncao.Text = _funcao;
            txtGestorImediato.Text = _gestorImediato;
            txtMatricula.Text =_matricula;
            txtNome.Text = _nome;

            LoadAttachment(formulario);
        }
        private void LoadAttachment(Formulario formulario)
        {
            string attachmentName = formulario.AttachmentName;

            if (formulario.AttachmentName != "")
            {
                if (attachmentName.Length > 20)
                {
                    attachmentName = attachmentName.Substring(0, 20) + "...";
                }
                trAnexar.Visible = false;

                lbAnexo.Text = attachmentName;
                trAnexo.Visible = true;
                
            }
            else
            {
                trAnexar.Visible = false;
                trAnexo.Visible = false;
            }

            if (formulario.AttachmentName == ""  && !isValidPeriod && isAllowedUser)
            {
                trAnexar.Visible = true;
                trAnexo.Visible = false;
            }
            else
            {
                trAnexar.Visible = false;
                trAnexo.Visible = false;
            }
        }
        private void LoadGoals(int idForm)
        {
            MetaBO metaBO = new MetaBO();
            ListaMeta = metaBO.GetAllGoalsByForm(idForm);

            if (ListaMeta.Count > 0)
            {
                gdvMinhasMetas.DataSource = ListaMeta;
                gdvMinhasMetas.DataBind();
            }
            else
            {
                gdvMinhasMetas.DataSource = null;
                gdvMinhasMetas.DataBind();
            }
        }
        private void DisableControls(Formulario formulario)
        {
            if (formulario.Estagio != 4)
            {
                btnCadastrar.Enabled = false;
                btnEnviar.Enabled = false;
                gdvMinhasMetas.Enabled = false;
                btnExcluirAnexo.Enabled = false;
            }
        }
        private void SendEmail(string nomeGestor)
        {
            Colaborador gestor = new ColaboradorBO().GetEmployeeByName(nomeGestor);
            string UriSite = Dados.UriAID + string.Format(@"SitePages/AprovarMeta/Aprovar.aspx?form={0}&aprovador=Gestor", IdForm);
            string mensagem = String.Format(@"<p>Há uma AID pendente de aprovação. Para prosseguir, acesse o sistema ou <a href='{0}'>Clique aqui.</a></p>", UriSite);
            MailUtility.EnviarEmail(Dados.AIDEmail, gestor.Email, "smtp.abdi.com.br", mensagem);
        }
        private void InsertAttachment(int idForm, FileUpload _fileUpload)
        {
            byte[] contents = null;

            using (Stream fileStream = _fileUpload.PostedFile.InputStream)
            {
                contents = new byte[fileStream.Length];
                fileStream.Read(contents, 0, (int)fileStream.Length);
                fileStream.Close();
            }
            string fileName = Path.GetFileName(_fileUpload.PostedFile.FileName);

            FormularioBO formularioBO = new FormularioBO();
            formularioBO.InsertAttachment(idForm, fileName, contents);
        }
        private void SetGoalApproval(GridView gridview)
        {
            foreach (GridViewRow row in gridview.Rows)
            {
                DataKey dtKey = gridview.DataKeys[row.RowIndex];
                int _idMeta = Convert.ToInt32(dtKey["ID"]);

                MetaBO metaBO = new MetaBO();
                Meta meta = metaBO.GetGoalById(_idMeta);
                if (meta.Aprovacao == "Criado")
                {
                    meta.Aprovacao = "Aprovado";
                    metaBO.SetGoalApproval(meta);
                }
            }
        }
        private void SendGoal()
        {
            string nomeGestor = txtGestorImediato.Text;
            int idForm = IdForm;

            FormularioBO formularioBO = new FormularioBO();
            if (formularioBO.isPopulated(idForm))
            {
                /*Atualizar o Estágio do Formulário*/
                Categoria categoria = new CategoriaBO().GetIdCategory("Gestor Imediato");
                formularioBO.SetFormStage(idForm, categoria.IdCategoria);

                /*Persistir Histórico*/
                Historico historico = new Historico()
                {
                    IdFormulario = IdForm,
                    Origem = "4",
                    Destino = categoria.IdCategoria.ToString(),
                    AcaoId = 3
                };
                HistoricoBO historicoBO = new HistoricoBO();
                historicoBO.CreateHistory(historico);

                /*Enviar e-mail*/
                SendEmail(nomeGestor);

                /*Mudar aprovação da meta*/
                //SetGoalApproval(gdvMinhasMetas);

                /*Mensagem de aprovação*/
                StringBuilder sb = new StringBuilder();
                sb.Append(@"<script>alert('Sua AID foi enviada para aprovação do seu gestor e estará inativa para qualquer alteração.');</script>");
                Response.Write(sb.ToString());
                Response.Redirect(@"/SitePages/Default.aspx");
                /*Desativar Controles*/
                Formulario formulario = formularioBO.GetFormById(idForm);
                if (formulario != null)
                {
                    DisableControls(formulario);
                }
            }
        }
        
        #endregion
        
        #region Eventos

        protected void gdvMinhasMetas_RowCommand(object sender, GridViewCommandEventArgs e)
        {

            int rowIndex = Convert.ToInt32(e.CommandArgument);
            DataKey dataKey = gdvMinhasMetas.DataKeys[rowIndex];
            int id = Convert.ToInt32(dataKey["ID"]);
            IdGoal = id;

            if (e.CommandName == "Editar")
            {
                string path = string.Format("/SitePages/EditaMeta.aspx?f={0}&Idm={1}", IdForm, IdGoal);
                Response.Redirect(path);
            }
        }
        protected void gdvMinhasMetas_DataBound(object sender, EventArgs e)
        {
            if (ListaMeta.Count > 0)
            {
                GridViewRow footer = gdvMinhasMetas.FooterRow;
                footer.Cells[0].Text = "Valor:";
                footer.Cells[2].CssClass = "valorTotal";
                footer.Cells[2].Text = string.Format("{0}%", ListaMeta.Sum(p => p.Peso));
            }
        }
        protected void gdvMinhasMetas_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                string descricao = e.Row.Cells[0].Text.ToString();
                if (descricao.Length > 200)
                {
                    e.Row.Cells[0].Text = descricao.ToString().Substring(0, 200) + "...";
                }

                string ferrramentaMedicao = e.Row.Cells[1].Text.ToString();
                if (ferrramentaMedicao.Length > 200)
                {
                    e.Row.Cells[1].Text = ferrramentaMedicao.ToString().Substring(0, 200) + "...";
                }
            }
        }
        
        #endregion

        #region Buttons

        protected void btnCadastrar_Click(object sender, EventArgs e)
        {
            int idForm = IdForm;
            string path = String.Format("/SitePages/CadastrarMetas.aspx?idForm={0}", idForm);
            Response.Redirect(path);
        }
        protected void btnEnviar_Click(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();

            try
            {
                FormularioBO formBO = new FormularioBO();
                Formulario form = formBO.GetFormById(IdForm);

                //Verifica se é um período válido.
                if (isValidPeriod)
                {
                    SendGoal();
                }
                else
                {
                    //Verifica se é um usuário com exceção.
                    if (isAllowedUser)
                    {
                        //Caso seja um usuário com exceção deverá, obrigatoriamente, ter um anexo.
                        if (form.AttachmentUrl != "")
                        {
                            SendGoal();
                        }
                        else
                        {
                            sb.Remove(0, sb.Length);
                            sb.Append(@"<script>alert('Insira um anexo.');</script>");
                            Response.Write(sb.ToString());
                        }
                    }
                    else
                    {
                        sb.Remove(0, sb.Length);
                        sb.Append(@"<script>alert('O período para envio da AID 2012 já expirou.');</script>");
                        Response.Write(sb.ToString());
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Erro ao enviar a meta. Erro:" + ex.Message);
            }
        }
        protected void btnOk_Click(object sender, EventArgs e)
        {
            try
            {
                int idForm = IdForm;

                if (fileUpload.PostedFile != null && fileUpload.HasFile)
                {
                    string strName = fileUpload.PostedFile.FileName;
                    InsertAttachment(idForm, fileUpload);

                    if (strName.Length > 20)
                    {
                        strName = strName.Substring(0, 20) + "...";
                    }

                    lbAnexo.Text = strName;
                    trAnexo.Visible = true;
                    trAnexar.Visible = false;
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Erro ao inserir anexo. Erro: " + ex.Message);
            }
        }
        protected void btnExcluirAnexo_Click(object sender, EventArgs e)
        {
            try
            {
                int idForm = IdForm;
                FormularioBO formularioBO = new FormularioBO();
                formularioBO.DeleteAttachment(idForm);
                Formulario formulario = formularioBO.GetFormById(idForm);
                LoadAttachment(formulario);
            }
            catch(Exception ex)
            {
                throw new Exception("Erro ao carregar ao excluir o anexo. Error: " + ex.Message);
            }
        }
        protected void lbAnexo_Click(object sender, EventArgs e)
        {
            int idForm = IdForm;

            FormularioBO formularioBO = new FormularioBO();
            Formulario formulario = formularioBO.GetFormById(idForm);

            string AttachmentUrl = formulario.AttachmentUrl.Trim();
            string AttachmentName = formulario.AttachmentName;

            if (formulario.AttachmentName != "")
            {
                System.Web.HttpContext.Current.Session["FileName"] = AttachmentName;
                System.Web.HttpContext.Current.Session["Attachment"] = AttachmentUrl;
            }
            else
            {
                //Mandar mensagem de anexo não encontrado.
            }

            if (AttachmentUrl != string.Empty || AttachmentUrl != "")
            {
                Response.Redirect("download.aspx");
            }
        }
        protected void btnDeletar_OnClick(object sender, EventArgs e)
        {
            ImageButton imageButton = (ImageButton)sender;

            GridViewRow row = (GridViewRow)imageButton.NamingContainer;
            int rowIndex = row.RowIndex;

            DataKey dtKey = gdvMinhasMetas.DataKeys[rowIndex];
            int idGoal = Convert.ToInt32(dtKey["ID"]);
            IdGoal = idGoal;

            MetaBO metaBO = new MetaBO();
            metaBO.DeleteGoal(IdGoal);
            LoadGoals(IdForm);
        }
        
        #endregion

        protected void gdvMinhasMetas_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

    }
}
